import { IAppDEUIAction } from '@ibiz/model-core';
import {
  IUIActionResult,
  IUILogicParams,
  UIActionProviderBase,
} from '@ibiz-template/runtime';

/**
 * 导出PDF
 *
 * @export
 * @class ExportPDFUIActionProvider
 * @extends {UIActionProviderBase}
 */
export class ExportPDFUIActionProvider extends UIActionProviderBase {

  /**
   * 执行界面行为
   *
   * @param {IAppDEUIAction} action
   * @param {IUILogicParams} args
   * @return {*}  {Promise<IUIActionResult>}
   * @memberof ExportPDFUIActionProvider
   */
  async execAction(
    action: IAppDEUIAction,
    args: IUILogicParams,
  ): Promise<IUIActionResult> {
    const { data, context, params } = args;
    const { resultParams } = await this.handleParams(
      action,
      context, data, params
    );
    let html = '';
    if (resultParams.queryselector) {
      html = document.querySelector(resultParams.queryselector);
    } else if (resultParams.dataitemname) {
      html = data[0]?.[resultParams.dataitemname]
    }
    if (!html) {
      ibiz.message.warning('未指定导出目标');
      return { cancel: true };
    };
    this.exportPDF(html, resultParams.filename);
    return {};
  }

  /**
   * 导出PDF
   *
   * @private
   * @param {(string | Element)} html
   * @param {string} [fileName='下载文件'] 文件名
   * @return {*}  {void}
   * @memberof ExportPDFUIActionProvider
   */
  private exportPDF(html: string | Element, fileName: string = '下载文件'): void {
    const html2canvas = (window as any).html2canvas;
    const jsPDF = (window as any).jspdf?.jsPDF;
    if (!html2canvas || !jsPDF) return ibiz.message.warning('静态资源未加载，导出异常');
    let element: Element | undefined;
    if (typeof html === 'string') {
      // 创建一个新的 div 元素
      element = document.createElement('div');
      element.innerHTML = html;
      // 添加到文档中，确保样式生效
      document.body.appendChild(element); 
    } else {
      element = html;
    }
    
    html2canvas(element, { scale: 2 }).then((canvas: IParams) => {
      const imgData = canvas.toDataURL('image/png', 1.0); // 高质量 PNG
      const pdf = new jsPDF('p', 'mm', 'a4'); // 创建jsPDF实例

      // 定义边距（单位：mm）
      const margin = 10;
      // A4纸的宽度和高度（单位：mm）
      const a4Width = 210;
      const a4Height = 297;

      // 计算实际可用的宽度和高度
      const usableWidth = a4Width - margin * 2; // 减去两边的边距
      const usableHeight = a4Height - margin * 2; // 减去顶部和底部的边距

      // 根据可用宽度计算图片的高度，保持宽高比
      const imgWidth = usableWidth;
      const imgHeight = (canvas.height * imgWidth) / canvas.width;

      let heightLeft = imgHeight;
      let position = margin; // 初始位置从下边距开始

      // 如果内容高度超过一页，则自动分页
      while (heightLeft > 0) {
        if (heightLeft < usableHeight) {
          // 添加图像到PDF，并考虑左边距和当前position
          pdf.addImage(imgData, 'PNG', margin, position, imgWidth, heightLeft);
          heightLeft = 0; // 结束循环
        } else {
          // 添加图像到当前页，并考虑左边距和当前position
          pdf.addImage(
            imgData,
            'PNG',
            margin,
            position,
            imgWidth,
            usableHeight,
          );
          heightLeft -= usableHeight;
          position = margin; // 重置位置
          pdf.addPage(); // 添加新页
        }
      }

      pdf.save(`${fileName}.pdf`); // 下载PDF文件
      if (typeof html === 'string' && element) document.body.removeChild(element);
    });
  }
}
